<!DOCTYPE html>
<link rel="help" href="https://drafts.csswg.org/css-scroll-snap-1/#scroll-snap-type" />
<link rel="help" href="https://drafts.csswg.org/css-writing-modes-4/#principal-flow" />
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<body>
<style>
body {
  height: 8000px;
  width: 3000px;
  margin: 0px;
}
#target {
  position: absolute;
  background-color: blue;
  top: 2000px;
  left: 100px;

  width: 100vw;
  height: 100px;
}
</style>
<div id="target"></div>
<script>
const documentHeight = document.documentElement.clientHeight;

function cleanup() {
  document.documentElement.style.scrollSnapType = "none";
  target.style.scrollSnapAlign = "";
  document.body.style.writingMode = "";
  window.scrollTo(0, 0);
}

test(t => {
  t.add_cleanup(cleanup);
  document.documentElement.style.scrollSnapType = "y mandatory";
  target.style.scrollSnapAlign = "end none";

  window.scrollTo(0, 1800);

  // `target y (2000px)` + `target height (100px)` - document height.
  assert_equals(document.scrollingElement.scrollTop, 2100 - documentHeight);
  assert_equals(document.scrollingElement.scrollLeft, 0, "x should not snap");
}, "The scroll-snap-type on the root element is applied");

test(t => {
  t.add_cleanup(cleanup);

  document.documentElement.style.scrollSnapType = "inline mandatory";
  document.body.style.writingMode = "vertical-lr";
  target.style.scrollSnapAlign = "none end";

  window.scrollTo(200, 1800);

  // Since inline axis is vertical, scrolling viewport vertically on block
  // axis should snap.
  assert_equals(document.scrollingElement.scrollTop, 2100 - documentHeight, "inline should snap");
  // `target x (100px)`.
  assert_equals(document.scrollingElement.scrollLeft, 200, "block should not snap");
}, "The writing-mode (vertical-lr) on the body is used");

test(t => {
  t.add_cleanup(cleanup);

  document.documentElement.style.scrollSnapType = "inline mandatory";
  document.body.style.writingMode = "horizontal-tb"; // inline is horizontal
  target.style.scrollSnapAlign = "none start";

  window.scrollTo(200, 1800);

  // Though the target's width is 100vw, there may be room to scroll the window
  // within the target because of the scrollbar width and the browser may snap
  // to the right edge (instead of the left edge of the target, since it is
  // closer to the offset of 200 and still a valid snap point) within this room.
  const scrollbar_width = window.innerWidth - document.documentElement.clientWidth;
  assert_approx_equals(document.scrollingElement.scrollLeft, 100, scrollbar_width, "inline should snap");
  assert_equals(document.scrollingElement.scrollTop, 1800, "block should not snap");
}, "The writing-mode (horizontal-tb) on the body is used ");
</script>
</body>
